package Class;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-05-14
 * Time: 21:48
 */
public class Data {
    //什么是面向对象编程：对象对象之间 进行协作完成 关注的是 对象
    //1.找对象
    //2.创建对象
    //3.使用对象

    //语法：class 类型名{ }

    //成员变量：
    public int year;
    public int month;
    public int day;

    public Data() {
        System.out.println("这个是不带参数的构造方法……");
    }
    //构造方法出现了重载：
    public Data(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
        System.out.println("这个是带三个参数的构造方法……");
    }
    //成员方法：
    //写一个方法 来设置 年月日
    public void setData1(int y, int m, int d) {
        year = y;
        month = m;
        day = d;
    }
    public void setData2(int year, int month, int day) {
        year = year;
        month = month;
        day = day;
        //结果全是 0 原因：形参自己给自己赋值了，并没有修改到对象当中的year、month、day
        //此时在方法内year、month、day都是局部变量。此时局部变量优先使用
        //解决方案： 加this关键字
    }
    public void setData(Data this, int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
        //解决方案： 加this关键字
    }
    //打印
    public void printData(Data this) {//也隐藏了一个Data this
        System.out.println(this.year+"年 "+this.month+"月 "+this.day+"日 ");
    }

    //主方法：
    public static void main(String[] args) {
        //对象的实例化
        Data data = new Data();

        Data data1 = new Data(2010, 12, 15);
        data1.printData();

        //问题：什么是构造方法：与普通的方法不同的一点是 构造方法没有返回值
        //构造方法的作用：
        //在对象的实例化时，可以借用 构造方法 对 对象进行初始化
        //1.不止一个构造方法
        //2.构造方法 作用就是用来初始化 对象当前的成员

        //结论：当你没写 任何构造方法 的时候
        //Java会提供一个默认的不带参数的构造方法，Java就不会再给你提供不带参数的构造方法！！
    }
    public static void main1(String[] args) {
        //对象的初始化(对象的实例化)
        Data data = new Data();
        data.setData(2008, 8, 8);
        data.printData();

        Data data1 = new Data();
        data1.setData(2009, 9, 9);
        data1.printData();

        Data data2 = new Data();
        data2.setData(2010, 10, 10);
        data2.printData();
        //提出问题：这么多对象，都调用了同一个setData方法，在这个方法中，是怎么区分是哪个对象调用setData中的year、month、day?
        //用this关键字：代表的是当前对象的引用
        //就相当于把当前对象的地址(引用)传递给成员方法了，就可以找到对应的当前对象，不会产生混乱了
        //(哪个对象的引用 调用了该方法 this就代表哪个对象)
        //其实，在成员方法中隐藏了一个形参：Data this

        //System.out.println(this.year);//error
        //this不能在静态方法中使用

        //this的用法：
        //1.可以通过this访问 当前对象的成员变量
        //2.可以通过this访问 当前对象的成员方法
        //3.可以通过this访问当前对象的 构造方法
    }
}
